<!DOCTYPE html>



  


<html class="theme-next gemini use-motion" lang="zh-CN">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
<meta name="theme-color" content="#222">









<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />















  
  
  <link href="/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css" />




  
  
  
  

  
    
    
  

  
    
      
    

    
  

  
    
      
    

    
  

  
    
      
    

    
  

  
    
      
    

    
  

  
    
    
    <link href="//fonts.googleapis.com/css?family=Microsoft YaHei:300,300italic,400,400italic,700,700italic|Microsoft YaHei:300,300italic,400,400italic,700,700italic|Microsoft YaHei:300,300italic,400,400italic,700,700italic|Microsoft YaHei:300,300italic,400,400italic,700,700italic|Inziu Iosevka Slab SC:300,300italic,400,400italic,700,700italic&subset=latin,latin-ext" rel="stylesheet" type="text/css">
  






<link href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css" />

<link href="/css/main.css?v=5.1.2" rel="stylesheet" type="text/css" />


  <meta name="keywords" content="Hexo, NexT" />








  <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico?v=5.1.2" />






<meta name="description" content="学习的核心目的，就是改善性能。对于一个学习问题，我们需要明确三个特征：任务的类型，衡量任务性能提升的标准以及获取经验的来源。">
<meta property="og:type" content="article">
<meta property="og:title" content="Aliyun Deep Learning Primer Series">
<meta property="og:url" content="http://idmk.oschina.io/2017/09/18/aliyun-deep-learning-primer-series/index.html">
<meta property="og:site_name" content="苦舟">
<meta property="og:description" content="学习的核心目的，就是改善性能。对于一个学习问题，我们需要明确三个特征：任务的类型，衡量任务性能提升的标准以及获取经验的来源。">
<meta property="og:locale" content="zh-CN">
<meta property="og:image" content="http://idmk.oschina.io/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170918201439613.png">
<meta property="og:image" content="http://idmk.oschina.io/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170919084928761.png">
<meta property="og:image" content="http://idmk.oschina.io/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170919144624991.png">
<meta property="og:image" content="http://idmk.oschina.io/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170919150354104.png">
<meta property="og:image" content="http://idmk.oschina.io/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170919150724895.png">
<meta property="og:image" content="http://idmk.oschina.io/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170919150918872.png">
<meta property="og:image" content="http://idmk.oschina.io/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170919150947171.png">
<meta property="og:image" content="http://idmk.oschina.io/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170919151019847.png">
<meta property="og:image" content="http://idmk.oschina.io/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170919153826326.png">
<meta property="og:image" content="http://idmk.oschina.io/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170919153855212.png">
<meta property="og:image" content="http://idmk.oschina.io/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170919163921535.png">
<meta property="og:image" content="http://idmk.oschina.io/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170919164347613.png">
<meta property="og:updated_time" content="2017-11-22T15:33:53.549Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Aliyun Deep Learning Primer Series">
<meta name="twitter:description" content="学习的核心目的，就是改善性能。对于一个学习问题，我们需要明确三个特征：任务的类型，衡量任务性能提升的标准以及获取经验的来源。">
<meta name="twitter:image" content="http://idmk.oschina.io/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170918201439613.png">



<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/',
    scheme: 'Gemini',
    sidebar: {"position":"left","display":"hide","offset":12,"offset_float":12,"b2t":false,"scrollpercent":false,"onmobile":false},
    fancybox: true,
    tabs: true,
    motion: true,
    duoshuo: {
      userId: '0',
      author: '博主'
    },
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>



  <link rel="canonical" href="http://idmk.oschina.io/2017/09/18/aliyun-deep-learning-primer-series/"/>





  <title>Aliyun Deep Learning Primer Series | 苦舟</title>
  














</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="zh-CN">

  
  
    
  

  <div class="container sidebar-position-left page-post-detail ">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-wrapper">
  <div class="site-meta ">
    

    <div class="custom-logo-site-title">
      <a href="/"  class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">苦舟</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
      
        <p class="site-subtitle">学海无涯，吾将上下求索。</p>
      
  </div>

  <div class="site-nav-toggle">
    <button>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
    </button>
  </div>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br />
            
            首页
          </a>
        </li>
      
        
        <li class="menu-item menu-item-categories">
          <a href="/categories/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-th"></i> <br />
            
            分类
          </a>
        </li>
      
        
        <li class="menu-item menu-item-about">
          <a href="/about/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-user"></i> <br />
            
            关于
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/archives/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br />
            
            归档
          </a>
        </li>
      
        
        <li class="menu-item menu-item-tags">
          <a href="/tags/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-tags"></i> <br />
            
            标签
          </a>
        </li>
      
        
        <li class="menu-item menu-item-commonweal">
          <a href="/404.html" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-heartbeat"></i> <br />
            
            公益404
          </a>
        </li>
      

      
        <li class="menu-item menu-item-search">
          
            <a href="javascript:;" class="popup-trigger">
          
            
              <i class="menu-item-icon fa fa-search fa-fw"></i> <br />
            
            搜索
          </a>
        </li>
      
    </ul>
  

  
    <div class="site-search">
      
  <div class="popup search-popup local-search-popup">
  <div class="local-search-header clearfix">
    <span class="search-icon">
      <i class="fa fa-search"></i>
    </span>
    <span class="popup-btn-close">
      <i class="fa fa-times-circle"></i>
    </span>
    <div class="local-search-input-wrapper">
      <input autocomplete="off"
             placeholder="搜索..." spellcheck="false"
             type="text" id="local-search-input">
    </div>
  </div>
  <div id="local-search-result"></div>
</div>



    </div>
  
</nav>



 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  

  
  
  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://idmk.oschina.io/2017/09/18/aliyun-deep-learning-primer-series/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="东木金">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/uploads/avatar.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="苦舟">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">Aliyun Deep Learning Primer Series</h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2017-09-18T20:09:32+08:00">
                2017-09-18
              </time>
            

            

            
          </span>

          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        <p>学习的核心目的，就是改善性能。<br>对于一个学习问题，我们需要明确三个特征：任务的类型，衡量任务性能提升的标准以及获取经验的来源。<br><a id="more"></a></p>
<h2 id="学习的-4-个象限"><a href="#学习的-4-个象限" class="headerlink" title="学习的 4 个象限"></a>学习的 4 个象限</h2><p>一般说来，人类的知识在两个维度上可分成四类：<br><img src="/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170918201439613.png" alt="人类知识的 4 个象限" title="人类知识的 4 个象限"></p>
<p>在横向方向上，对于可推理的，我们都可以通过机器学习的方法，最终可以完成这个推理。传统的机器学习方法，就是试图找到可举一反三的方法，向可推理但不可统计的象限进发（象限Ⅱ）。目前看来，这个象限的研究工作（即基于推理的机器学习）陷入了不温不火的境地，能不能峰回路转，还有待时间的检验。</p>
<p>而在纵向上，对于可统计的、但不可推理的（即象限Ⅲ），可通过神经网络这种特定的机器学习方法，以期望达到性能提升的目的。目前，基于深度学习的棋类博弈（阿尔法狗）、计算机视觉（猫狗识别）、自动驾驶等等，其实都是在这个象限做出了了不起的成就。</p>
<p>统计机器学习的对象，其实就是数据。</p>
<h2 id="机器学习的方法论"><a href="#机器学习的方法论" class="headerlink" title="机器学习的方法论"></a>机器学习的方法论</h2><p>这里稍早说明的一点的是，在深度学习中，经常有“ end-to-end（端到端）”学习的提法，与之相对应的传统机器学习是“ Divide and Conquer（分而治之）”。这些都是什么意思呢？</p>
<p>“ end-to-end ”（端到端）说的是，输入的是原始数据（始端），然后输出的直接就是最终目标（末端），中间过程不可知，因此也难以知。比如说，基于深度学习的图像识别系统，输入端是图片的像素数据，而输出端直接就是或猫或狗的判定。这个端到端就是：像素 –&gt; 判定。</p>
<p>就此，有人批评深度学习就是一个黑箱（Black Box）系统，其性能很好，却不知道为何而好，也就是说，缺乏解释性。其实，这是由于深度学习所处的知识象限决定的。从图 1 可以看出，深度学习，在本质上，属于可统计不可推理的范畴。“可统计”是很容易理解的，就是说，对于同类数据，它具有一定的统计规律，这是一切统计学习的基本假设。那“不可推理”又是什么概念？其实就是“剪不断、理还乱”的非线性状态了。</p>
<p>在哲学上讲，这种非线性状态，是具备了整体性的“复杂系统”，属于复杂性科学范畴。复杂性科学认为，构成复杂系统的各个要素，自成体系，但阡陌纵横，其内部结构难以分割。简单来说，对于复杂系统，1+1 ≠ 2，也就是说，一个简单系统，加上另外一个简单系统，其效果绝不是两个系统的简单累加效应，而可能是大于部分之和。因此，我们必须从整体上认识这样的复杂系统。于是，在认知上，就有了从一个系统或状态（end）直接整体变迁到另外一个系统或状态（end）的形态。这就是深度学习背后的方法论。</p>
<p>与之对应的是“ Divide and Conquer（分而治之）”，其理念正好相反，在哲学它属于“还原主义（reductionism，或称还原论）”。在这种方法论中，有一种“追本溯源”的蕴意包含其内，即一个系统（或理论）无论多复杂，都可以分解、分解、再分解，直到能够还原到逻辑原点。</p>
<p>3 个核心是指：卷积（Convolution）、池化（Poling）和非线性处理（ReLU）。三概念是指：局部感受域（Local receptive filed）、权值共享（Weight sharing）和亚采样（Subsampling）。</p>
<p>特征图谱（feature map），又称“卷积特征（convolved feature）”或 “激活图（activation map）”。</p>
<h2 id="卷积在图像处理中的应用"><a href="#卷积在图像处理中的应用" class="headerlink" title="卷积在图像处理中的应用"></a>卷积在图像处理中的应用</h2><p>下面我们简单介绍一下常用的“久经考验”的卷积核。</p>
<ol>
<li>同一化核（Identity）。从图 10-5 可见，这个滤波器什么也没有做，卷积后得到的图像和原图一样。因为这个核只有中心点的值是 1。邻域点的权值都是 0，所以对滤波后的取值没有任何影响。</li>
<li>边缘检测核（Edge Detection），也称为高斯 - 拉普拉斯算子。需要注意的是，这个核矩阵的元素总和为 0（即中间元素为 8，而周围 8 个元素之和为 -8），所以滤波后的图像会很暗，而只有边缘位置是有亮度的。</li>
<li>图像锐化核（Sharpness Filter）。图像的锐化和边缘检测比较相似。首先找到边缘，然后再把边缘加到原来的图像上面，如此一来，就强化了图像的边缘，使得图像看起来更加锐利。</li>
<li>均值模糊（Box Blur /Averaging）。这个核矩阵的每个元素值都是 1，它当前像素和它的四邻域的像素一起取平均，然后再除以 9。均值模糊比较简单，但图像处理得不够平滑。因此，还可以采用高斯模糊核（Gaussian Blur），这个核被广泛用在图像降噪上。</li>
</ol>
<p>事实上，还有很多有意思的卷积核，比如说浮雕核（embossing Filter），它可以给图像营造一种比较艺术化的 3D 阴影效果，如图 10-6 所示。浮雕核将中心一边的像素值减去另一边的像素值。这时，卷积出来的像素值可能是负数，我们可以将负数当成阴影，而把正数当成光，然后再对结果图像加上一定数值的偏移即可。</p>
<h3 id="常用于图像处理的卷积核有哪些"><a href="#常用于图像处理的卷积核有哪些" class="headerlink" title="常用于图像处理的卷积核有哪些"></a>常用于图像处理的卷积核有哪些</h3><p><a href="http://blog.csdn.net/zouxy09/article/details/49080029" target="_blank" rel="external">http://blog.csdn.net/zouxy09/article/details/49080029</a></p>
<h3 id="边界处理"><a href="#边界处理" class="headerlink" title="边界处理"></a>边界处理</h3><p><a href="http://blog.csdn.net/zouxy09/article/details/49080029" target="_blank" rel="external">http://blog.csdn.net/zouxy09/article/details/49080029</a></p>
<p><a href="http://blog.sina.com.cn/s/blog_4bdb170b01019atv.html" target="_blank" rel="external">图像处理－线性滤波－ 1 基础（相关算子、卷积算子、边缘效应）</a></p>
<h2 id="拓扑结构"><a href="#拓扑结构" class="headerlink" title="拓扑结构"></a>拓扑结构</h2><img src="/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170919084928761.png" alt="markdown-img-paste-20170919084928761.png" title="">
<p>也就是说，可以先由 m 个卷积层和激活层叠加，然后 ( 可选 ) 进行一次池化操作，重复这个结构 n 次，最后叠加 k 个全连接层（m, n, k ≥ 1）。总体来讲，卷积神经网络通过多层处理，逐渐将初始的“低层”特征表示，转化为“高层”特征表示，之后再用“简单模型”即可完成复杂的分类等学习任务。因此在本质上，深度学习就是一个“特征学习（feature learning）”或“表示学习（representation learning）”。</p>
<h2 id="CIFAR-10-图像集"><a href="#CIFAR-10-图像集" class="headerlink" title="CIFAR-10 图像集"></a>CIFAR-10 图像集</h2><p>CIFAR-10 最早是由 Hinton 教授带领他的两名学生 Alex Krizhevsky 与 Vinod Nair 等人一起收集的微型图像集。该图像集由 60,000 张 32×32 的 RGB 彩色图片构成，共 10 个大分类，其中 50,000 张图片用作训练，另外随机抽取 10,000 张用作测试（交叉验证）。</p>
<p>CIFAR-10 最大的特点莫过于，它将识别的范围扩大到普适物体。相比于已经非常成熟的人脸识别，普适物体的识别更具有挑战性，因为普适图像数据集中含有各样各异的特征，甚至噪声，而且图像中的物体大小比例不一，这些都无疑增加了普适物体判别的难度。</p>
<p>CIFAR-10 在深度学习等领域非常有影响力。这是因为它是很多人 “深度学习”实战的起点（比如说，Theano、TensorFlow 等深度学习框架都常用到这个数据集来做实战练习）。它的存在，在客观上加速推动了“深度学习”的普及进程。可以说，Hinton 教授的功劳，不仅仅体现他对深度学习算法的创新上，还体现于他对深度学习的普及上。</p>
<h2 id="池化"><a href="#池化" class="headerlink" title="池化"></a>池化</h2><p>池化丝毫不会影响计算机对图片的特征提取。<br>这么说是有理论支撑的。这个理论就是局部线性变换的不变性（invariant）。它说的是，如果输入数据的局部进行了线性变换操作（如平移或旋转等），那么经过池化操作后，输出的结果并不会发生变化。局部平移“不变性”特别有用，尤其是我们关心某个特征是否出现，而不关心它出现的位置时。例如，在模式识别场景中，当我们检测人脸时，我们只关心图像中是否具备人脸的特征，而并不关心人脸是在图像的左上角和右下角。</p>
<p>因为池化综合了（过滤核范围内的）全部邻居的反馈，即通过 k 个像素的统计特性而不是单个像素来提取特征，自然这种方法能够大大提高神经网络的性能。</p>
<h2 id="循环递归-RNN，序列建模套路深"><a href="#循环递归-RNN，序列建模套路深" class="headerlink" title="循环递归 RNN，序列建模套路深"></a>循环递归 RNN，序列建模套路深</h2><p><a href="https://yq.aliyun.com/articles/169880?spm=5176.100239.blogcont86580.23.MVxwaq" target="_blank" rel="external">https://yq.aliyun.com/articles/169880?spm=5176.100239.blogcont86580.23.MVxwaq</a><br>所谓马尔科夫链，通俗来讲，就是未来的一切，仅与当前有关，而与历史无关。<br>谈到 RNN，这里需要指明，它其实是两种不同神经网络的缩写。一种是时间递归神经网络（recurrent neural network），另一种是结构递归神经网络（recursive neural network）。请注意，很多文献也分别将它们称为“循环神经网络”和“递归神经网络”。在下文中，如果不特别注明，在提及 RNN 时，指的是“时间递归神经网络”，即“循环神经网络”。<br>其他神经网络都无法利用历史数据的时间依赖关系，来分析数据特征，从而可能导致对当前和未来产生一些不合理的预测。<br>RNN 的核心诉求之一，就是能将以往的信息连接到当前任务之中。此类网络内部有反馈连接，能够处理信号中的时间依赖性。</p>
<p>然而，第一代 RNN 网络并没有引起世人瞩目。这是因为 RNN 在利用反向传播调参过程中产生了严重的梯度消失问题。随后，上世纪 90 年代后期出现了重大突破，如 LSTM（Long Short-Term Memory，长短期记忆网络[4]）等模型的提出，让新一代的 RNN 获得蓬勃发展。</p>
<h3 id="Elman-递归神经网络"><a href="#Elman-递归神经网络" class="headerlink" title="Elman 递归神经网络"></a>Elman 递归神经网络</h3><p>循环神经网络之所以被称之为“循环”，就是因为它的网络表现形式有循环结构，从而使得过去输出的信息作为记忆而被保留下来，并可应用于当前输出的计算中。也就是说，RNN 的同一隐层之间的节点是有连接的。</p>
<h2 id="RNN-的结构及其训练"><a href="#RNN-的结构及其训练" class="headerlink" title="RNN 的结构及其训练"></a>RNN 的结构及其训练</h2><h3 id="结构"><a href="#结构" class="headerlink" title="结构"></a>结构</h3><p>Elman RNN 网络模型除了 X 向量表示输入层的值，O 向量表示输出层的值之外，一共就有三类参数值，分别是 U、V 和 W。假设输入层神经元个数为 n 个，隐层的神经元个数为 m 个，输出层的神经元个数为 r，那么 U 是输入层到隐藏层的权重矩阵，大小为（n×m）维；V 是隐层到输出层的权重矩阵，大小为（m×r）维。<br>那么，W 又是什么呢？通过前面的介绍我们知道，RNN 中隐层 s(t) 的值，不仅仅取决于当前输入 x，还取决于上一次隐层的值 s(t − 1)。如此一来，W 表示的就是隐藏层上一次输出值而作为本次输入的权重矩阵，大小为（m×m）维。<br><img src="/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170919144624991.png" alt="markdown-img-paste-20170919144624991.png" title=""></p>
<p>第 t 时间的记忆信息是由前（t-1）个时间步累计而成的结果 s(t − 1) 和当前的输出 X(t) 共同决定的。这些信息保存在隐层中，不断向后传递，跨越多个时间步，共同影响每个输入新信息的处理结果。</p>
<h3 id="训练"><a href="#训练" class="headerlink" title="训练"></a>训练</h3><p>训练 RNN 的算法叫做时间反向传播（BackPropagation Through Time，简称 BPTT）。</p>
<h4 id="问题建模"><a href="#问题建模" class="headerlink" title="问题建模"></a>问题建模</h4><p>最小化损失函数的前提是，先确定下来损失函数的形式，问题建模的首要任务就是，确定隐层和输出层的输出函数分别是什么？<br>假设隐层用的激活函数是 sigmoid（当然也可以是其他激活函数），那么在任意第 t 时间步，隐层的输出 s(t) 可表示为公式：<br><img src="/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170919150354104.png" alt="markdown-img-paste-20170919150354104.png" title=""></p>
<p>在第 t 时间步的输出层 o(t) 可表示为公式<br><img src="/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170919150724895.png" alt="markdown-img-paste-20170919150724895.png" title=""></p>
<p>这里 b 和 c 是偏置参数向量。与输入层和隐层不同的是，输出层的设计更加灵活多变，它并不要求每个时间步都必须有输出。比如说，在面向文本分析的情感分类案例中，输入可以是一系列的单词，但输出只是整个句子的情感，它和单词之间并不是一一对应的关系，它只需给出整体的判定分类就可。</p>
<p>对于分类模型，通常输出层在最后还要利用 softmax 激活函数做归一化处理，该函数将一个 m 维的向量压缩为一个 m 维的实数向量，而且这些实数向量的元素都介于（0, 1）之间，实际上就是一个概率向量。经过 softmax 函数处理后，最终“修饰”后的输出 y(t) 可用公式（13-4）表示<br><img src="/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170919150918872.png" alt="markdown-img-paste-20170919150918872.png" title=""></p>
<h4 id="优化目标函数"><a href="#优化目标函数" class="headerlink" title="优化目标函数"></a>优化目标函数</h4><p>基于前面公式（13-1）至公式（13-4）反映出的模型，接下来就是构建损失函数，然后设法求得损失函数的最小值，这就形成了我们所需优化的目标函数 J( θ )。这里为了方便计算，我们使用了负对数似然函数（即交叉熵）。<br><img src="/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170919150947171.png" alt="markdown-img-paste-20170919150947171.png" title=""><br>其中，y(t)(j) 表示为输出 y(t) 的第 j 个元素。参数θ表示激活函数σ中的所有参数集合[U, V, W; b , c]。</p>
<h4 id="参数求解"><a href="#参数求解" class="headerlink" title="参数求解"></a>参数求解</h4><p>和传统 BP 反向传播算法一样，BPTT 算法的核心也是求解参数的导数。所不同的是，BPTT 算法中的参数有 5 类，如公式（13-6）所示。<br><img src="/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170919151019847.png" alt="markdown-img-paste-20170919151019847.png" title=""></p>
<p>由于 RNN 中采用的激活函数是 sigmoid，其导数值域锁定在[0,1/4]范围之内。故此，每一层反向传播过程，梯度都会以前一层 1/4 的速度递减。可以想象，随着传递时间步数的不断增加，梯度会呈现指数级递减趋势，直至梯度消失（vanishing gradient），如图 13-6 所示。假设当前时刻为 t，那么在 (t-3) 时刻，梯度将递减至 (1/4)3=1/64，以此类推。</p>
<h3 id="注意"><a href="#注意" class="headerlink" title="注意"></a>注意</h3><p>RNN 中的“深度”，不同于传统的深度神经网络，它主要是指时间和空间（如网络中的隐层个数）特性上的深度。<br>我们知道传统 CNN（卷积神经网络）的主要特点是“局部连接”、“权值共享”和“局部平移不变性”，其中“权值共享”意味着“计算共享”，它节省了大量计算开销。而 RNN 则不同，它是随着“时间”深度的加深，通过对参数实施“平流移植”来实现“计算共享”的。</p>
<h2 id="LSTM"><a href="#LSTM" class="headerlink" title="LSTM"></a>LSTM</h2><p>有时，遗忘是件好事，它让你对琐碎之事不再斤斤计较。</p>
<p>长短期记忆 (Long Short-Term Memory，简称 LSTM)。请注意“ Short-term ”中间有一个短横线“ - ”连接。这表明，在本质上，LSTM 还是短期记忆 (short-term memory)，只是它历经的时序较长而已。</p>
<p>我们知道，传统 RNN 多采用反向传播时间（BPTT）算法。这种算法的弊端在于，随着时间的流逝，网络层数的增多，会产生梯度消失或梯度爆炸等问题。<br>“梯度消失”说的是，如果梯度较小的话（<1），多层迭代以后，指数相乘，梯度很快就会下降到对调参几乎就没有影响了。想一想，(0.99)^100 0="" 是不是趋近于="" ？="" “梯度爆炸”说的是，反过来，如果梯度较大的话（="">1），多层迭代以后，又导致了梯度大的不得了。想一想，(1.01)^100 是不是也很大？<br>权重爆炸可能引起权重振荡。梯度消失又导致网络调参失去方向感。这些场景都会让 BPTT 望“参”兴叹。于是，它在呼唤一个新的策略让 RNN 复活。</1），多层迭代以后，指数相乘，梯度很快就会下降到对调参几乎就没有影响了。想一想，(0.99)^100></p>
<p>LSTM 由于独特的设计结构，LSTM 特别适合于处理时序间隔和延迟非常长的任务，而且性能奇佳。<br>2014 年，Bengio 团队提出了一种更加好用的 LSTM 变体 GRU (Gated Recurrent Unit，门控环单元 )。</p>
<h3 id="拆解-LSTM"><a href="#拆解-LSTM" class="headerlink" title="拆解 LSTM"></a>拆解 LSTM</h3><h4 id="传统-RNN-的问题所在"><a href="#传统-RNN-的问题所在" class="headerlink" title="传统 RNN 的问题所在"></a>传统 RNN 的问题所在</h4><p>为了考虑更远的信息我们也可把 RNN 的结构做深一点，但限于前文提到的缺点，如梯度弥散等问题，前面网络层的信息如 x0 、x1，…, 等，“流淌”到当前层，有用的信息已所剩无几。或者说，过去的信息已经被抛弃（“遗忘”）了。有时，这样有用但又为抛弃的神经单元，也称为泄漏单元（leaky unit）。</p>
<h4 id="改造的神经元"><a href="#改造的神经元" class="headerlink" title="改造的神经元"></a>改造的神经元</h4><p>第一代 RNN 的问题，出在神经元的功能不健全上，它把该记住的遗忘了，又把该遗忘的记住了。那如何来改造它呢？这个时候，就要体现胡伯提出的 LSTM 的工作了。LSTM 的核心本质在于，通过引入巧妙的可控自循环，以产生让梯度能够得以长时间可持续流动的路径 。<br>假如我们在原有神经元的基础上再增加一个状态，即 c，让它“合理地”保存长期的状态，不就解决问题了吗？其结构如图 14-3 所示 .</p>
<img src="/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170919153826326.png" alt="图 14-3 调整神经的功能" title="图 14-3 调整神经的功能">
<p>假设新增加的状态 c，称为记忆单元态 (cell state)，亦称为“记忆块（memory block）”，用以取代传统的隐含神经元节点。它负责把记忆信息从序列的初始位置，传递到序列的末端。下面我们把图 14-3 按照时间步展开，得到如图 14-4 所示的示意图。</p>
<img src="/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170919153855212.png" alt="按时间步展开的 RNN 网络" title="按时间步展开的 RNN 网络">
<p>从示意图 14-4 可看出，在 LSTM 结构中，在 t 时刻，当前神经元（粗红线标识）的输入有三个：当前时刻输入值 xt、前一时刻输出值 st − 1 和前一时刻的记忆单元状态 ct − 1。输出有两个：当前时刻 LSTM 输出值 st 和当前时刻的记忆单元状态 ct。需要注意的是，这里的 x，s 和 c 都是向量，里面都包含多个参数值。</p>
<p>现在 LSTM 关键之处来了，那就是如何有效控制这个长期状态 c 而为我所用呢？这里，LSTM 的设计思路是设计 3 把控制门开关（gate），从而打造一个可控记忆神经元，如图 14-5 所示。<br><img src="/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170919163921535.png" alt="markdown-img-paste-20170919163921535.png" title=""></p>
<p>这第一把门开关，就是负责决定把前一个长期记忆 ct − 1 在多大程度上保留到 ct 中，它可选择性地遗忘部分之前积累的信息；第二把门开关，就是负责控制以多大程度把当前即时状态存入到长期记忆状态 ct 中；第三把开关，负责控制是否把长期状态 c，作为当前 LSTM 的输出。有了这三把好用的开关，记忆就如是酒保手中的酒，是“勾兑”可调的。<br>接下来，让我们要聊聊，在记忆单元中，内部状态 c 和输出 s 是如何计算的。</p>
<p>前文描述的门开关，实际上是一个比喻。在真正的算法中，哪有什么所谓的“开关”？这里的“门开关”，实际上就是一个全连接网络层，它的输入是一个复杂的矩阵向量，而输出是一个 0 到 1 之间的实数向量。请注意，由于“门”和“层”的关系是，一个是比喻，一个是实现，所以后文中我们可能混搭表述。<br>LSTM 实际上通过调控某些全连接层网络参数，来达到调控输出的目的。如果输出可控，那么“门”的开和关，就可以模拟出来了。<br>假设 W 是门的权重向量，b 为偏置向量，这个“门”可表示为公式（14-1）。<br><img src="/2017/09/18/aliyun-deep-learning-primer-series/markdown-img-paste-20170919164347613.png" alt="markdown-img-paste-20170919164347613.png" title=""></p>
<p>这里，激活函数σ可用挤压函数 sigmoid 函数的输出来控制门的开与关。由于 sigmoid 函数的值域被控制在 0 和 1 之间。那么，激活函数输出为 0 时，任何向量与之相乘，结果为 0，这就相当于“门”关上了；那如果输出为 1 时，任何向量与之相乘都不会改变，这就相当于“门”完全开启。当输出值在 0 至 1 之间呢，这相当于门是半掩半开的，就可以调控“记忆”的留存程度。<br>还记得吗？在第 13 章中，我们说过，人们通常都不具备“马尔科夫链思维”，言外之意，就是说，我们当前的内心感受，都是历史的投射和当下的输入，叠加在一起的结果。这就好比一个场景，“一巴掌挨在脸上（当前输入），新仇旧恨涌上心头（历史记忆）”。</p>
<p>类似地，LSTM 也设计两个门控制记忆单元状态 c 的信息量：一个是遗忘门（forget gate）。所谓的“遗忘”，也就是“记忆的残缺”。它决定了上一时刻的单元状态有多少“记忆”可以保留到当前时刻；另一个是输入门（input gate），它决定了当前时刻的输入有多少保存到单元状态。<br>在图 14-5 中，我们说过，LSTM 是由三个门来实现的。实际上，为了表述方便，很多文献还添加了一个门，叫候选门（Candidate gate），它控制着以多大比例融合“历史”信息和“当下”刺激。<br>最后，LSTM 还设计了一个输出门（output gate），来来控制单元状态有多少信息输出。下面对这 4 个门分别进行详细介绍。</p>

      
    </div>
    
    
    

    

    

    

    <footer class="post-footer">
      

      
      
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/2017/09/16/Scipy-high-level-scientific-computing/" rel="next" title="Scipy High Level Scientific Computing">
                <i class="fa fa-chevron-left"></i> Scipy High Level Scientific Computing
              </a>
            
          </div>

          <span class="post-nav-divider"></span>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/2017/09/20/install-tensorflow-on-ubuntu1604/" rel="prev" title="Install Tensorflow on Ubuntu1604">
                Install Tensorflow on Ubuntu1604 <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </div>
  
  
  
  </article>



    <div class="post-spread">
      
    </div>
  </div>


          </div>
          


          
  <div class="comments" id="comments">
    
  </div>


        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    
    <div class="sidebar-inner">

      

      
        <ul class="sidebar-nav motion-element">
          <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap" >
            文章目录
          </li>
          <li class="sidebar-nav-overview" data-target="site-overview">
            站点概览
          </li>
        </ul>
      

      <section class="site-overview sidebar-panel">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
          <img class="site-author-image" itemprop="image"
               src="/uploads/avatar.jpg"
               alt="东木金" />
          <p class="site-author-name" itemprop="name">东木金</p>
           
              <p class="site-description motion-element" itemprop="description">正在学习机器学习，希望能变得很强！</p>
          
        </div>
        <nav class="site-state motion-element">

          
            <div class="site-state-item site-state-posts">
              <a href="/archives/">
                <span class="site-state-item-count">162</span>
                <span class="site-state-item-name">日志</span>
              </a>
            </div>
          

          
            
            
            <div class="site-state-item site-state-categories">
              <a href="/categories/index.html">
                <span class="site-state-item-count">18</span>
                <span class="site-state-item-name">分类</span>
              </a>
            </div>
          

          
            
            
            <div class="site-state-item site-state-tags">
              <a href="/tags/index.html">
                <span class="site-state-item-count">42</span>
                <span class="site-state-item-name">标签</span>
              </a>
            </div>
          

        </nav>

        

        <div class="links-of-author motion-element">
          
            
              <span class="links-of-author-item">
                <a href="https://github.com/bdmk" target="_blank" title="GitHub">
                  
                    <i class="fa fa-fw fa-github"></i>
                  
                    
                      GitHub
                    
                </a>
              </span>
            
              <span class="links-of-author-item">
                <a href="mailto:catcherchan94@outlook.com" target="_blank" title="E-Mail">
                  
                    <i class="fa fa-fw fa-envelope"></i>
                  
                    
                      E-Mail
                    
                </a>
              </span>
            
          
        </div>

        
        

        
        

        


      </section>

      
      <!--noindex-->
        <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
          <div class="post-toc">

            
              
            

            
              <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-2"><a class="nav-link" href="#学习的-4-个象限"><span class="nav-number">1.</span> <span class="nav-text">学习的 4 个象限</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#机器学习的方法论"><span class="nav-number">2.</span> <span class="nav-text">机器学习的方法论</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#卷积在图像处理中的应用"><span class="nav-number">3.</span> <span class="nav-text">卷积在图像处理中的应用</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#常用于图像处理的卷积核有哪些"><span class="nav-number">3.1.</span> <span class="nav-text">常用于图像处理的卷积核有哪些</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#边界处理"><span class="nav-number">3.2.</span> <span class="nav-text">边界处理</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#拓扑结构"><span class="nav-number">4.</span> <span class="nav-text">拓扑结构</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#CIFAR-10-图像集"><span class="nav-number">5.</span> <span class="nav-text">CIFAR-10 图像集</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#池化"><span class="nav-number">6.</span> <span class="nav-text">池化</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#循环递归-RNN，序列建模套路深"><span class="nav-number">7.</span> <span class="nav-text">循环递归 RNN，序列建模套路深</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#Elman-递归神经网络"><span class="nav-number">7.1.</span> <span class="nav-text">Elman 递归神经网络</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#RNN-的结构及其训练"><span class="nav-number">8.</span> <span class="nav-text">RNN 的结构及其训练</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#结构"><span class="nav-number">8.1.</span> <span class="nav-text">结构</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#训练"><span class="nav-number">8.2.</span> <span class="nav-text">训练</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#问题建模"><span class="nav-number">8.2.1.</span> <span class="nav-text">问题建模</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#优化目标函数"><span class="nav-number">8.2.2.</span> <span class="nav-text">优化目标函数</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#参数求解"><span class="nav-number">8.2.3.</span> <span class="nav-text">参数求解</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#注意"><span class="nav-number">8.3.</span> <span class="nav-text">注意</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#LSTM"><span class="nav-number">9.</span> <span class="nav-text">LSTM</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#拆解-LSTM"><span class="nav-number">9.1.</span> <span class="nav-text">拆解 LSTM</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#传统-RNN-的问题所在"><span class="nav-number">9.1.1.</span> <span class="nav-text">传统 RNN 的问题所在</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#改造的神经元"><span class="nav-number">9.1.2.</span> <span class="nav-text">改造的神经元</span></a></li></ol></li></ol></li></ol></div>
            

          </div>
        </section>
      <!--/noindex-->
      

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright" >
  
  &copy;  2017 - 
  <span itemprop="copyrightYear">2018</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">东木金</span>
</div>


<div class="powered-by">
  由 <a class="theme-link" href="https://hexo.io">Hexo</a> 强力驱动
</div>

<div class="theme-info">
  主题 -
  <a class="theme-link" href="https://github.com/iissnan/hexo-theme-next">
    NexT.Gemini
  </a>
</div>


        

        
      </div>
    </footer>

    
      <div class="back-to-top">
        <i class="fa fa-arrow-up"></i>
        
      </div>
    

  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  












  
  <script type="text/javascript" src="/lib/jquery/index.js?v=2.1.3"></script>

  
  <script type="text/javascript" src="/lib/fastclick/lib/fastclick.min.js?v=1.0.6"></script>

  
  <script type="text/javascript" src="/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>

  
  <script type="text/javascript" src="/lib/velocity/velocity.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>

  
  <script type="text/javascript" src="/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>


  


  <script type="text/javascript" src="/js/src/utils.js?v=5.1.2"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=5.1.2"></script>



  
  


  <script type="text/javascript" src="/js/src/affix.js?v=5.1.2"></script>

  <script type="text/javascript" src="/js/src/schemes/pisces.js?v=5.1.2"></script>



  
  <script type="text/javascript" src="/js/src/scrollspy.js?v=5.1.2"></script>
<script type="text/javascript" src="/js/src/post-details.js?v=5.1.2"></script>



  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=5.1.2"></script>



  


  




	





  





  






  

  <script type="text/javascript">
    // Popup Window;
    var isfetched = false;
    var isXml = true;
    // Search DB path;
    var search_path = "search.xml";
    if (search_path.length === 0) {
      search_path = "search.xml";
    } else if (/json$/i.test(search_path)) {
      isXml = false;
    }
    var path = "/" + search_path;
    // monitor main search box;

    var onPopupClose = function (e) {
      $('.popup').hide();
      $('#local-search-input').val('');
      $('.search-result-list').remove();
      $('#no-result').remove();
      $(".local-search-pop-overlay").remove();
      $('body').css('overflow', '');
    }

    function proceedsearch() {
      $("body")
        .append('<div class="search-popup-overlay local-search-pop-overlay"></div>')
        .css('overflow', 'hidden');
      $('.search-popup-overlay').click(onPopupClose);
      $('.popup').toggle();
      var $localSearchInput = $('#local-search-input');
      $localSearchInput.attr("autocapitalize", "none");
      $localSearchInput.attr("autocorrect", "off");
      $localSearchInput.focus();
    }

    // search function;
    var searchFunc = function(path, search_id, content_id) {
      'use strict';

      // start loading animation
      $("body")
        .append('<div class="search-popup-overlay local-search-pop-overlay">' +
          '<div id="search-loading-icon">' +
          '<i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>' +
          '</div>' +
          '</div>')
        .css('overflow', 'hidden');
      $("#search-loading-icon").css('margin', '20% auto 0 auto').css('text-align', 'center');

      $.ajax({
        url: path,
        dataType: isXml ? "xml" : "json",
        async: true,
        success: function(res) {
          // get the contents from search data
          isfetched = true;
          $('.popup').detach().appendTo('.header-inner');
          var datas = isXml ? $("entry", res).map(function() {
            return {
              title: $("title", this).text(),
              content: $("content",this).text(),
              url: $("url" , this).text()
            };
          }).get() : res;
          var input = document.getElementById(search_id);
          var resultContent = document.getElementById(content_id);
          var inputEventFunction = function() {
            var searchText = input.value.trim().toLowerCase();
            var keywords = searchText.split(/[\s\-]+/);
            if (keywords.length > 1) {
              keywords.push(searchText);
            }
            var resultItems = [];
            if (searchText.length > 0) {
              // perform local searching
              datas.forEach(function(data) {
                var isMatch = false;
                var hitCount = 0;
                var searchTextCount = 0;
                var title = data.title.trim();
                var titleInLowerCase = title.toLowerCase();
                var content = data.content.trim().replace(/<[^>]+>/g,"");
                var contentInLowerCase = content.toLowerCase();
                var articleUrl = decodeURIComponent(data.url);
                var indexOfTitle = [];
                var indexOfContent = [];
                // only match articles with not empty titles
                if(title != '') {
                  keywords.forEach(function(keyword) {
                    function getIndexByWord(word, text, caseSensitive) {
                      var wordLen = word.length;
                      if (wordLen === 0) {
                        return [];
                      }
                      var startPosition = 0, position = [], index = [];
                      if (!caseSensitive) {
                        text = text.toLowerCase();
                        word = word.toLowerCase();
                      }
                      while ((position = text.indexOf(word, startPosition)) > -1) {
                        index.push({position: position, word: word});
                        startPosition = position + wordLen;
                      }
                      return index;
                    }

                    indexOfTitle = indexOfTitle.concat(getIndexByWord(keyword, titleInLowerCase, false));
                    indexOfContent = indexOfContent.concat(getIndexByWord(keyword, contentInLowerCase, false));
                  });
                  if (indexOfTitle.length > 0 || indexOfContent.length > 0) {
                    isMatch = true;
                    hitCount = indexOfTitle.length + indexOfContent.length;
                  }
                }

                // show search results

                if (isMatch) {
                  // sort index by position of keyword

                  [indexOfTitle, indexOfContent].forEach(function (index) {
                    index.sort(function (itemLeft, itemRight) {
                      if (itemRight.position !== itemLeft.position) {
                        return itemRight.position - itemLeft.position;
                      } else {
                        return itemLeft.word.length - itemRight.word.length;
                      }
                    });
                  });

                  // merge hits into slices

                  function mergeIntoSlice(text, start, end, index) {
                    var item = index[index.length - 1];
                    var position = item.position;
                    var word = item.word;
                    var hits = [];
                    var searchTextCountInSlice = 0;
                    while (position + word.length <= end && index.length != 0) {
                      if (word === searchText) {
                        searchTextCountInSlice++;
                      }
                      hits.push({position: position, length: word.length});
                      var wordEnd = position + word.length;

                      // move to next position of hit

                      index.pop();
                      while (index.length != 0) {
                        item = index[index.length - 1];
                        position = item.position;
                        word = item.word;
                        if (wordEnd > position) {
                          index.pop();
                        } else {
                          break;
                        }
                      }
                    }
                    searchTextCount += searchTextCountInSlice;
                    return {
                      hits: hits,
                      start: start,
                      end: end,
                      searchTextCount: searchTextCountInSlice
                    };
                  }

                  var slicesOfTitle = [];
                  if (indexOfTitle.length != 0) {
                    slicesOfTitle.push(mergeIntoSlice(title, 0, title.length, indexOfTitle));
                  }

                  var slicesOfContent = [];
                  while (indexOfContent.length != 0) {
                    var item = indexOfContent[indexOfContent.length - 1];
                    var position = item.position;
                    var word = item.word;
                    // cut out 100 characters
                    var start = position - 20;
                    var end = position + 80;
                    if(start < 0){
                      start = 0;
                    }
                    if (end < position + word.length) {
                      end = position + word.length;
                    }
                    if(end > content.length){
                      end = content.length;
                    }
                    slicesOfContent.push(mergeIntoSlice(content, start, end, indexOfContent));
                  }

                  // sort slices in content by search text's count and hits' count

                  slicesOfContent.sort(function (sliceLeft, sliceRight) {
                    if (sliceLeft.searchTextCount !== sliceRight.searchTextCount) {
                      return sliceRight.searchTextCount - sliceLeft.searchTextCount;
                    } else if (sliceLeft.hits.length !== sliceRight.hits.length) {
                      return sliceRight.hits.length - sliceLeft.hits.length;
                    } else {
                      return sliceLeft.start - sliceRight.start;
                    }
                  });

                  // select top N slices in content

                  var upperBound = parseInt('1');
                  if (upperBound >= 0) {
                    slicesOfContent = slicesOfContent.slice(0, upperBound);
                  }

                  // highlight title and content

                  function highlightKeyword(text, slice) {
                    var result = '';
                    var prevEnd = slice.start;
                    slice.hits.forEach(function (hit) {
                      result += text.substring(prevEnd, hit.position);
                      var end = hit.position + hit.length;
                      result += '<b class="search-keyword">' + text.substring(hit.position, end) + '</b>';
                      prevEnd = end;
                    });
                    result += text.substring(prevEnd, slice.end);
                    return result;
                  }

                  var resultItem = '';

                  if (slicesOfTitle.length != 0) {
                    resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + highlightKeyword(title, slicesOfTitle[0]) + "</a>";
                  } else {
                    resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + title + "</a>";
                  }

                  slicesOfContent.forEach(function (slice) {
                    resultItem += "<a href='" + articleUrl + "'>" +
                      "<p class=\"search-result\">" + highlightKeyword(content, slice) +
                      "...</p>" + "</a>";
                  });

                  resultItem += "</li>";
                  resultItems.push({
                    item: resultItem,
                    searchTextCount: searchTextCount,
                    hitCount: hitCount,
                    id: resultItems.length
                  });
                }
              })
            };
            if (keywords.length === 1 && keywords[0] === "") {
              resultContent.innerHTML = '<div id="no-result"><i class="fa fa-search fa-5x" /></div>'
            } else if (resultItems.length === 0) {
              resultContent.innerHTML = '<div id="no-result"><i class="fa fa-frown-o fa-5x" /></div>'
            } else {
              resultItems.sort(function (resultLeft, resultRight) {
                if (resultLeft.searchTextCount !== resultRight.searchTextCount) {
                  return resultRight.searchTextCount - resultLeft.searchTextCount;
                } else if (resultLeft.hitCount !== resultRight.hitCount) {
                  return resultRight.hitCount - resultLeft.hitCount;
                } else {
                  return resultRight.id - resultLeft.id;
                }
              });
              var searchResultList = '<ul class=\"search-result-list\">';
              resultItems.forEach(function (result) {
                searchResultList += result.item;
              })
              searchResultList += "</ul>";
              resultContent.innerHTML = searchResultList;
            }
          }

          if ('auto' === 'manual') {
            input.addEventListener('input', inputEventFunction);
          } else {
            $('.search-icon').click(inputEventFunction);
            input.addEventListener('keypress', function (event) {
              if (event.keyCode === 13) {
                inputEventFunction();
              }
            });
          }

          // remove loading animation
          $(".local-search-pop-overlay").remove();
          $('body').css('overflow', '');

          proceedsearch();
        }
      });
    }

    // handle and trigger popup window;
    $('.popup-trigger').click(function(e) {
      e.stopPropagation();
      if (isfetched === false) {
        searchFunc(path, 'local-search-input', 'local-search-result');
      } else {
        proceedsearch();
      };
    });

    $('.popup-btn-close').click(onPopupClose);
    $('.popup').click(function(e){
      e.stopPropagation();
    });
    $(document).on('keyup', function (event) {
      var shouldDismissSearchPopup = event.which === 27 &&
        $('.search-popup').is(':visible');
      if (shouldDismissSearchPopup) {
        onPopupClose();
      }
    });
  </script>





  

  

  

  
  
    <script type="text/x-mathjax-config">
      MathJax.Hub.Config({
        tex2jax: {
          inlineMath: [ ['$','$'], ["\\(","\\)"]  ],
          processEscapes: true,
          skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
        }
      });
    </script>

    <script type="text/x-mathjax-config">
      MathJax.Hub.Queue(function() {
        var all = MathJax.Hub.getAllJax(), i;
        for (i=0; i < all.length; i += 1) {
          all[i].SourceElement().parentNode.className += ' has-jax';
        }
      });
    </script>
    <script type="text/javascript" src="//cdn.bootcss.com/mathjax/2.7.1/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
  


  

  

</body>
</html>
